/*
  web 控制 IO 测试
*/
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>


#define AP_SSID "Test"              //这里改成你的AP名字--AP账号
#define AP_PSW "12345678"           //这里改成你的AP密码 8位以上

IPAddress local_IP(192, 168, 1, 1); //实例化IP地址
IPAddress gateway(192, 168, 1, 1);  //实例化网关IP地址
IPAddress subnet(255, 255, 255, 0); //实例化子网掩码

ESP8266WebServer server(80);


void setup() {
  Serial.begin(115200);  //串口配置波特率
  delay(2000);
  pinMode(D5, OUTPUT); //设置D5引脚为输出模式以便控制LED
  
  Serial.print("配置AP网络信息。。。。。。");
  WiFi.mode(WIFI_AP);   //设置WIFI模式为AP模式
  delay(2000);
  Serial.println(WiFi.softAPConfig(local_IP, gateway, subnet) ? "网络配置成功" : "网络配置失败");  //配置AP网络信息---并且串口提示输出
  Serial.print("设置AP......");
  bool result = WiFi.softAP(AP_SSID, AP_PSW);  //设置账号和密码,通道为1，wifi不隐藏，最大连接数=4
  //返回值：是否成功
  if (result) {
    Serial.println("账号密码设置成功");
    Serial.println(String("Soft-AP IP 地址是: ") + String(WiFi.softAPIP().toString()));
    //WiFi.softAPIP()    获取AP的IP地址--就是IPAddress local_IP(192,168,1,1)
    Serial.println("设置完成");
  } else {
    Serial.println("账号密码设置失败");
  }

  //server.on("/", handleRoot);
  //server.begin();
  server.begin();                           // 启动网站服务
  server.on("/", HTTP_GET, handleRoot);     // 设置服务器根目录即'/'的函数'handleRoot'
  server.on("/LED", HTTP_POST, handleLED);  // 设置处理LED控制请求的函数'handleLED'
  server.onNotFound(handleNotFound);        // 设置处理404情况的函数'handleNotFound'
  Serial.println("HTTP server started");
}


void loop() {
  server.handleClient();
}

/*设置服务器根目录即'/'的函数'handleRoot'
  该函数的作用是每当有客户端访问NodeMCU服务器根目录时，
  NodeMCU都会向访问设备发送 HTTP 状态 200 (Ok) 这是send函数的第一个参数。
  同时NodeMCU还会向浏览器发送HTML代码，以下示例中send函数中第三个参数，
  也就是双引号中的内容就是NodeMCU发送的HTML代码。该代码可在网页中产生LED控制按钮。 
  当用户按下按钮时，浏览器将会向NodeMCU的/LED页面发送HTTP请求，请求方式为POST。
  NodeMCU接收到此请求后将会执行handleLED函数内容*/
void handleRoot() {
    server.send(200, "text/html", "<form action=\"/LED\" method=\"POST\"><input type=\"submit\" value=\"LED\"></form>");
    Serial.println("访问根目录");
}

//处理LED控制请求的函数'handleLED'
void handleLED() {                          
  digitalWrite(D5,!digitalRead(D5));// 改变LED的点亮或者熄灭状态
  server.sendHeader("Location","/");// 跳转回页面根目录
  server.send(303);                 // 发送Http相应代码303 跳转  
  Serial.println("/LED 请求");
}

// 设置处理404情况的函数'handleNotFound'
void handleNotFound(){
  server.send(404, "text/plain", "404: Not found"); // 发送 HTTP 状态 404 (未找到页面) 并向浏览器发送文字 "404: Not found"
}
